"""

    并发运行任务 - as_completed

"""
import asyncio
import random

import aiohttp
from async_web import async_timed, fetch_status


async def delay(seconds):
    print(f"sleep for {seconds} seconds")
    await asyncio.sleep(seconds)


@async_timed()
async def main():
    async with aiohttp.ClientSession() as session:
        urls = ["http://www.baidu.com" for _ in range(10)]
        # 为要发出的每个请求生成一个协程列表
        requests = [fetch_status(session, url, sleep_time=random.randint(1, 5)) for url in urls]
        # 给一组协程设置超时时间
        for done_task in asyncio.as_completed(requests, timeout=2):
            try:
                print(await done_task)
            except asyncio.TimeoutError:
                print("超时")


# as_completed 可以尽快获得结果，但是缺点：
# 1、它是无序的，无法知道是哪个协程对应的结果
# 2、超时，它可以正确抛出异常，并继续运行程序，但取消任务，无法定位哪些任务可以被取消。
# 为了解决超时问题，asyncio.wait() 可以解决
# as_completed 缺点之一：当我们看到异常时，没有简单的方法可以取消已经在运行的任务。

asyncio.run(main())
